package homeWorks;

import java.io.*;
import java.util.Scanner;

/**
 * @author lijun
 * @date 2022-08-29 18:38
 * To
 * @date 2022-08-29 20:44
 */
public class Test03 {
    public static void main(String[] args) throws IOException {

        /**Test04
         * 改错
         * 程序实现的是简易记事本工具。程序启动后向pw.txt文件写内容
         * 用户输入的每一行字符串都写入到文件中，单独输入exit时
         * 程序退出。
         */
        /** Test04
		//FileInputStream fos = new FileInputStream("pw.txt");
        //【文件流错误】:Input读入,Output写出
        FileOutputStream fos = new FileOutputStream("pw.txt");
		//OutputStreamWriter osw = new OutputStreamWriter(fos,"UTF-8");
        //【拼写错误】:UTF-8 -> Utf-8
		OutputStreamWriter osw = new OutputStreamWriter(fos,"Utf-8");
		BufferedWriter bw = new BufferedWriter(osw);
		PrintWriter pw = new PrintWriter(bw,true);
        //【类名报错】:没有导包
        Scanner scanner = new Scanner(System.in);
		System.out.println("请开始输入内容");
		while(true) {
			String str = scanner.nextLine();
			if("exit".equals(str)) {
				break;
			}
            //【编译错误】:拼写错误
			pw.println(str);
			//pw.close();
		}
        //【编译错误】:作用域错误(未报错)
        pw.close();
         */




        /**Test03
         * 扫描指定目录中的所有.java文件，并将内容全部输出到控制台
         * 例如将当前项目目录下src/io目录中的所有java文件内容输出
         * 到控制台
         * 1:先要定位./src/io目录(哪个API用来描述目录?)
         * 2:获取该目录下的所有.java文件
         * 3:遍历每一个java文件，然后按行读取里面的每一行字符串
         *   并输出控制台
         */
        /**Test03 第一种写法(我的写法)
        File file = new File("./src/main/java/io");
        File[] files = file.listFiles(f -> f.getName().endsWith(".java"));
        for (File sub : files) {
            try (
                    BufferedReader br = new BufferedReader(
                            new InputStreamReader(
                                    new FileInputStream(sub)));
            ) {
                String line;
                while ((line = br.readLine()) != null) {
                    System.out.println(line);
                }
            } catch (IOException e) {
                System.out.println("IO异常");
            }
        }
         */
        /**Test03 第二种写法
        File dir = new File("./src/main/java/io");//【指定文件路径】
        File[] subs = dir.listFiles(f->f.getName().endsWith(".java"));//【文件数组,过滤器】
        for(int i=0;i<subs.length;i++){//【遍历数组内的每一个文件】
            File sub = subs[i];//【获取每一个文件】
            BufferedReader br = new BufferedReader(
                    new InputStreamReader(
                            new FileInputStream(sub)
                    )//【将每一个文件加载到缓冲流中】
            );
            String line;
            while((line = br.readLine())!=null){//【当获取到字符串内容时循环】
                System.out.println(line);//【输出字符串内容】
            }
        }
         */


        /**Test02
         * 将当前目录下的所有obj文件获取到，并进行
         * 反序列化后输出每个用户的信息(直接输出反序
         * 列化后的User对象即可)
         */
        /**Test02 第一种写法(我的写法)
        File file = new File("./");
            File[] subs = file.listFiles(f -> f.getName().endsWith(".obj"));
            for (File sub : subs) {
                try (
                        ObjectInputStream ois = new ObjectInputStream(new FileInputStream(sub))
                ) {
                    Object o = ois.readObject();
                    if ( o instanceof User) {
                        User u = (User)o ;
                        System.out.println(u);
                    }
                } catch (IOException | ClassNotFoundException e) {
                    System.out.println("IO或NotFoundException异常");
                }
            }
         */
        /**Test02 第二种写法
        File dir = new File(".");//【指定文件路径】
        File[] subs = dir.listFiles((f)->f.getName().endsWith(".obj"));//【文件数组,过滤器】
        for(int i=0;i<subs.length;i++){//【遍历数组内的每一个文件】
            File sub = subs[i];//【获取每一个文件】
            FileInputStream fis = new FileInputStream(sub);
            ObjectInputStream ois = new ObjectInputStream(fis);//【将文件反序列化】
            Object obj = ois.readObject();
            if(obj instanceof User){//【如果该文件对象继承或实现了User,则强制转换为该类型】
                User user = (User)obj;
                System.out.println(user);//【输出】
            }
        }
         */


        /**Test01  见:User.java & UserDemo.java
         * 设计一个类:User
         * 里面有四个属性:String name,String pwd,String nick,int age
         * 定义get,set方法以及toString方法和构造方法
         *
         * 单词记一记:
         * pwd   是单词password的缩写，是密码的意思
         * user  用户
         * 当前程序启动后要求用户顺序输入以上四个信息
         * 然后实例化一个User对象保存着四个信息并将
         * 该对象序列化到文件中。
         * 文件名的命名规则:用户名.obj
         * 比如该用户输入用户名为张三，那么这个对象
         * 序列化后的文件名为:张三.obj
         */
    }
}
